<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../resct18/react.development.js"></script>
    <script src="../resct18/react-dom.development.js"></script>
    <script src="../resct18/babel.min.js"></script>
</head>

<body>
    <div id="app"></div>
    <script type="text/babel">
    /* 
      请封装一个函数,可以按照以下调用的方式进行求和
        - add(1,2,3)
        - add(1,2)(3)
        - add(1)(2,3)
        - add(1)(2)(3)
        - add(1,2)(2,2)(3,2)....
    */
   function add (...arg) {
    let num = 0;
    //1.当函数调用add的时候,首先把第一次传入的参数和求出来
    /*  arg.reduce((p,c)=> p+c ,num)  rreduce的第一个参数是回调函数(回调函数里的第一个参数是上一次的值 第二个参数当前的值 第三个参数是下标 第四个参数是arr)  第二个参数是初始值 */
    num = arg.reduce((p,c)=> p+c ,num)
    // console.log(num);
    
    //然后调用add后面的第二个括号 
    const temp = (...arg) => {
    num = arg.reduce((p,c)=> p+c ,num)
    console.log(num);
    //3.当继续调用add后面的括号时 就继续执行这个函数
        return temp
    }

    //4.重写temp函数的toString方法,当函数转为字符串的时候,会隐式转换调用自身的toString方法
    temp.toString=function () {
        return num
    }

    //2.然后调用add后面的第二个括号 
    return temp
   }
   add(1,2)

   //当函数被alert的时候,会默认调用自身的toString方法
   alert(add(1,2)(3));
   alert(add(1)(2,3));
   alert(add(1)(2,3)(1)(2,3)(1)(2,3));
    </script>
</body>

</html>